/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modulo1;

import Modelo.CampoNovedad;
import Modelo.ReporteNovedad;
import Modelo.ComunidadUniversitaria;
import Modelo.EsImplicado;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import java.util.*;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.Message;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMessage;

/**
 *
 * @author miguel474
 */
public class AgregarReporteAction extends org.apache.struts.action.Action {
    /* forward name="success" path="" */

    static final String SUCCESS = "success";
    static final String FAILURE = "failure";

    /**
     * This is the action called from the Struts framework.
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @throws java.lang.Exception
     * @return
     */
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        // CAMPOS QUE VIENEN DEL FORM -->>

        AgregarReporteForm formBean = (AgregarReporteForm) form;
        String novGenSel = formBean.getNovGenSel();
        String novEspSel = formBean.getNovEspSel();
        String fecha_suceso = formBean.getFecha_suceso();
        String hora_suceso = formBean.getHora_suceso();
        String minutos_suceso = formBean.getMinutos_suceso();
        // Oficial que levanta la novedad
        String agrega = formBean.getAgrega();
        //
        String via = formBean.getVia();
        String sede = formBean.getSede();
        String ubicacion = formBean.getUbicacion();
        String[] pisos = formBean.getPisos();
        String[] tipos = formBean.getTipos();
        String[] id_campos = formBean.getId_campos();
        String[] nombre_campo = formBean.getNombre_campo();
        String[] valor_campo = formBean.getValor_campo();
        String[] validacion_campo = formBean.getValidacion_campo();
        String[] obligatorio_campo = formBean.getObligatorio_campo();
        String[] names = formBean.getNames();
        String[] lNames = formBean.getlNames();
        String[] nacs = formBean.getNacs();
        String[] cedulas = formBean.getCedulas();
        String[] telefonos = formBean.getTelefonos();
        String[] emails = formBean.getEmail();
        String[] dens = formBean.getDens();
        String[] agr = formBean.getAgr();
        String[] ind = formBean.getInd();
        String[] test = formBean.getTest();
        String tiempo_suceso = hora_suceso + ":" + minutos_suceso;
        String desc = formBean.getDescripcion();
        ActionErrors errors = new ActionErrors();
        String nivel = "";

        // <<--   CAMPOS QUE VIENEN DEL FORM

        boolean hay_alerta = false;
        List<String> correos = new ArrayList<String>();

        //Agrega el reporte a la bd
        ReporteNovedad reporte = new ReporteNovedad();
        reporte.setAgrega(agrega);
        reporte.setVia(via);
        reporte.setDescripcion(desc);
        reporte.setFechaSuceso(fecha_suceso);
        reporte.setTiempo(tiempo_suceso);
        reporte.setId_novedad_gen(Integer.parseInt(novGenSel));
        reporte.setId_novedad_esp(Integer.parseInt(novEspSel));
        reporte.setSede(sede);
        reporte.setEspacio(ubicacion);
        if (pisos == null) {
            reporte.setPiso(new String[0]);
        } else {
            reporte.setPiso(pisos);
        }

        /**
         * 
         *  ALARMAS
         * 
         * 
        correos = Modelo.DAL.Personal_DAO.getCorreosPersonal();
        
        // Este arreglo tendrá: ocurrencias totales ng, ocurrencias a corto plazo ng,
        // ocurrencias totales ne, ocurrencias a corto plazo ne, alerta general ng,
        // alerta cp ng, alerta general ne y alerta cp ne
        int ot_ng = 0;
        int oc_ng = 0;
        int ot_ne = 0;
        int oc_ne = 0;
        int ag_ng = 0;
        int ac_ng = 0;
        int ag_ne = 0;
        int ac_ne = 0;
        List<Integer> alarmas = Modelo.DAL.ReporteNovedad_DAO.getOcurrenciasAlarmas(id_gen, id_esp);
        
        if (id_esp != -1) {
        ot_ng = alarmas.get(0);
        oc_ng = alarmas.get(1);
        ot_ne = alarmas.get(2);
        oc_ne = alarmas.get(3);
        ag_ng = alarmas.get(4);
        ac_ng = alarmas.get(5);
        ag_ne = alarmas.get(6);
        ac_ne = alarmas.get(7);
        } else {
        ot_ng = alarmas.get(0);
        oc_ng = alarmas.get(1);
        ag_ng = alarmas.get(2);
        ac_ng = alarmas.get(3);
        }
        
        String Mensaje;
        
        //Envio de correos de alertas
        
        if ((ag_ng != 0 && (ot_ng % ag_ng == 0))||(ac_ng != 0&&(oc_ng % ac_ng == 0))) {
        Mensaje = "El presente correo es para informarle que se ha activado una alerta para la novedad "
        + nombre_gen + ".\nPor favor contacte a la brevedad a su respectivo supervisor para "
        + "que sea informado de las medidas pertinentes.\nDSI-USB";
        sendMail(correos, Mensaje);
        }else if((id_esp != -1) && ((ag_ne != 0 &&(ot_ne % ag_ne == 0))||(ac_ne != 0 && (oc_ne % ac_ne == 0)))){
        Mensaje = "El presente correo es para informarle que se ha activado una alerta para la novedad "
        + novEspSel + ".\nPor favor contacte a la brevedad a su respectivo supervisor para "
        + "que sea informado de las medidas pertinentes.\nDSI-USB";
        sendMail(correos, Mensaje);
        }
        
         **/
        // Asocia el Reporte a su Ubicación, si es un edificio registra los pisos donde
        // ocurrio el suceso.
        //Crea la lista con los datos de los implicados (los agrega a la BD en caso de que no existan
        List<ComunidadUniversitaria> implicados = new ArrayList<ComunidadUniversitaria>();
        List<EsImplicado> nivel_implicados = new ArrayList<EsImplicado>();

        for (int i = 0; i < cedulas.length; i++) {
            String nac = nacs[i];
            String cedula = cedulas[i];
            if (!cedula.equals("")) {
                ComunidadUniversitaria imp = new ComunidadUniversitaria();
                imp.setCi(nac + "-" + cedula);
                imp.setNombre1(names[i]);
                imp.setApellido1(lNames[i]);
                imp.setProfesion(tipos[i]);
                if (telefonos[i] != null && !telefonos[i].isEmpty()) {
                    imp.setTelefono(Integer.parseInt(telefonos[i]));
                } else {
                    imp.setTelefono(0);
                }
                if (emails[i] != null && !emails[i].isEmpty()) {
                    imp.setEmail(emails[i]);
                } else {
                    imp.setEmail("");
                }

                // Implicación

                EsImplicado registro = new EsImplicado();
                registro.setCi(imp.getCi());
                nivel = "";
                if (dens != null) {
                    if (dens[i] != null && !dens[i].equals("")) {
                        nivel += "D";
                    }
                }
                if (agr != null) {
                    if (agr[i] != null && !agr[i].equals("")) {
                        nivel += "A";
                    }
                }
                if (ind != null) {
                    if (ind[i] != null && !ind[i].equals("")) {
                        nivel += "I";
                    }
                }
                if (test != null) {
                    if (test[i] != null && !test[i].equals("")) {
                        nivel += "I";
                    }
                }
                registro.setTipoImplicado(nivel);
                implicados.add(imp);
                nivel_implicados.add(registro);
            }
        }
        List<CampoNovedad> campos = new ArrayList<CampoNovedad>();

        if (id_campos != null) {
            for (int i = 0;
                    i < id_campos.length;
                    i++) {
                CampoNovedad campo = new CampoNovedad();
                campo.setId_campo(id_campos[i]);
                campo.setNombre_campo(nombre_campo[i]);
                campo.setValor_campo(valor_campo[i]);
                campo.setValidacion_campo(validacion_campo[i]);
                campo.setObligatorio_campo(obligatorio_campo[i]);
                campos.add(campo);
            }
        }
        Integer reporteClave = Modelo.DAL.ReporteNovedad_DAO.insertarReporte(
                reporte, implicados, nivel_implicados, campos);

        if (reporteClave
                < 0) {
            System.out.println("Reporte Clave:" + reporteClave + ". Nuevo reporte no agregado!\n");
            errors.add("reporte_novedad_fallido", new ActionMessage("errors.reporte_novedad_fallido"));
            return mapping.findForward(FAILURE);
        }

        System.out.println(
                "Reporte Clave:" + reporteClave + ". Agregado Exitosamente!\n");



        return mapping.findForward(SUCCESS);
    }

    public static void sendMail(List<String> correos, String Mensaje) {
        try {
            for (int i = 0; i < correos.size(); i++) {
                Properties props = new Properties();
                props.setProperty("mail.smtp.host", "smtp.gmail.com");
                props.setProperty("mail.smtp.starttls.enable", "true");
                props.setProperty("mail.smtp.port", "587");
                props.setProperty("mail.smtp.user", "alertasigsi@gmail.com");
                props.setProperty("mail.smtp.auth", "true");

//             Preparamos la sesion
                Session session = Session.getDefaultInstance(props);

                // Construimos el mensaje
                MimeMessage message = new MimeMessage(session);
                message.setFrom(new InternetAddress("alertasigsi@gmail.com"));
                message.addRecipient(
                        Message.RecipientType.TO,
                        new InternetAddress(correos.get(i)));
                message.setSubject("Alerta de novedad");

                message.setText(Mensaje);

                // Lo enviamos.
                Transport t = session.getTransport("smtp");
                t.connect("alertasigsi@gmail.com", "alertasigsi123");
                t.sendMessage(message, message.getAllRecipients());

                // Cierre.
                t.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
